package model

import (
	"database/sql"
	"inventory/api/inventory"
	"inventory/internal/constant"
	"inventory/pkg/orm"
	"inventory/pkg/util"
	"time"
)

// BomConfig represents bom config.
type BomConfig struct {
	StorageKey  string    // 商品规格唯一标识prod_id-sku_id，或者加料唯一标识f-feed_id，用于快速批量搜索
	MaterialID  uint64    // 物料ID
	StorageType uint8     // 仓储类型： 2~商品（冗余存储，用于外部加载快速判定），3~加料(预留类型，仅pos单存在)
	RefID       uint64    // 商品ID
	SgID        uint32    // 品牌ID
	Status      uint8     // 1~有效，0~逻辑删除
	Operator    uint32    // 员工ID
	Quantity    float64   // 所需物料数量(按1份商品/斤两商品当前售卖1个单位）
	CreateTime  time.Time // 创建时间
	UpdateTime  time.Time // 更新时间
}

// ExpressCity represents express city region config.
type ExpressCity struct {
	WarehouseID           uint32       // 仓库ID
	Index                 uint32       // 城市区块序号
	FirstWeightPrice      uint64       // 首重费用（分）/ kg
	AdditionalWeightPrice uint64       // 续重费用（分）/ kg
	Operator              uint32       // 员工ID
	SgID                  uint32       // 品牌ID
	CityCodes             orm.IntArray // 续重费用（分）/ kg
	CreateTime            time.Time    // 创建时间
	UpdateTime            time.Time    // 更新时间
}

// ExpressConfig represents express info config.
type ExpressConfig struct {
	Info        string    // 配置信息
	Reason      string    // 申请拒绝原因
	WarehouseID uint32    `gorm:"primary_key"` // 仓库ID
	PlatformID  uint32    `gorm:"primary_key"` // 平台ID
	SgID        uint32    // 商户ID
	Status      uint8     // 绑定状态：0~申请中, 1~已配置,  2~已拒绝, 3~已解绑（删除时整行删除即可，仅随仓库&平台删除而删除）
	Operator    uint32    // 员工ID
	CreateTime  time.Time // 创建时间
	UpdateTime  time.Time // 更新时间
}

// ExpressCoordinates represents express coordinates config.
type ExpressCoordinates struct {
	WarehouseID uint32    `gorm:"primary_key"` // 仓库ID
	Index       uint32    `gorm:"primary_key"` // 仓库区域序号
	SgID        uint32    // 品牌ID
	StartingFee uint64    // 起送费用
	ShippingFee uint64    // 区域配送费（不满足包邮条件）
	Operator    uint32    // 操作员工ID
	CityCode    uint32    // 城市编码
	Status      bool      // 状态：1~有效，0~失效（更换地址触发），删除时直接删除行数据
	Coordinates orm.JSON  `gorm:"type:jsonb;not null"` // 区域坐标范围
	CreateTime  time.Time // 创建时间
	UpdateTime  time.Time // 更新时间
}

// ExpressOrder represents express order.
type ExpressOrder struct {
	ID          uint64         `gorm:"primary_key"` // 自增ID
	OrderNumber string         // 系统订单号
	OutTradeNo  sql.NullString // 外部请求号(录入模式时可空)
	TradeNo     string         // 平台流水号
	RiderName   string         // 骑手姓名
	RiderPhone  string         // 骑手联系方式
	OrderState  string         // 平台配送状态
	Reason      sql.NullString // 配送拒绝/失败原因
	OrderType   uint32         // 1~履约订单
	PlatformID  uint32         // 平台ID
	WarehouseID uint32         // 仓库ID
	DeliverFee  uint64         // 平台配送费
	Tips        uint64         // 小费
	Status      uint8          // 1~已呼叫待接单，2~已接单待取货，3~已到店正在取货，4~已发货/配送中，5~已签收，6~配送取消，7~配送失败
	Lat         float64        // 仓库纬度快照
	Lng         float64        // 仓库经度快照
	CreateTime  time.Time      // 呼叫时间
	UpdateTime  time.Time      // 推送/更新时间
}

// DeliveryStatus 配送状态
func (o ExpressOrder) DeliveryStatus() string {
	switch inventory.DeliverStatus(o.Status) {
	case inventory.DeliverStatus_ExpressOrderPending:
		return "待接单"
	case inventory.DeliverStatus_ExpressOrderWaitPickup:
		return "已接单"
	case inventory.DeliverStatus_ExpressOrderPickup:
		return "正在取货"
	case inventory.DeliverStatus_ExpressOrderDelivering:
		return "已发货/配送中"
	case inventory.DeliverStatus_ExpressOrderReceived:
		return "已签收"
	case inventory.DeliverStatus_ExpressOrderCanceled:
		return "配送取消"
	case inventory.DeliverStatus_ExpressOrderFailed:
		return "配送失败"
	default:
		return ""
	}
}

// ExpressPlatform represents express platform.
type ExpressPlatform struct {
	Name       string // 平台名称
	Icon       string // 平台图标
	ID         uint32 // 自增ID
	Mode       uint8  // 配送模式1~同城，2~普快
	ConfigType uint8  // 配置模式1~主动，2~运维配置
}

// FreezeDetail represents freeze order detail.
type FreezeDetail struct {
	IsAccounting            bool      // 如果存在父明细时，父明细为false，否则为true，只有子明细落入实际统计，以防止重复计算。
	OriginFreezeOrderNumber string    // 来源冻结单号（基于星团活动创建星团履约单）
	StorageKey              string    // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id
	StorageType             uint8     // 仓储类型：1~物料，2~商品，3~加料（冗余存储，用于外部加载快速判定）
	ID                      uint64    // 自增ID
	OrderID                 uint64    // 订单ID
	WarehouseID             uint32    // 仓库ID
	ParentID                uint64    // 父明细ID(无父明细时为0)
	TargetQuantity          float64   // 目标冻结数量(用于追加&追减)
	ConsumedQuantity        float64   // 已消费数量（与出库无关，商品被消费后叠加；未出库时可以解冻，解冻后减少(履约单下单&履约单取消时更新;出库操作无需更新)）
	ValidQuantity           float64   // 待出库数量(出库后减少，消费但未出库时不变; 已出库部分不支持解冻(出库&库存还原操作更新;冻结单取消等操作无需更新))
	CreateTime              time.Time // 明细创建时间
	UpdateTime              time.Time // 明细更新时间
	ProdName                string    // 商品名称
	SkuName                 string    // 规格名称
}

// FreezeOrder represents freeze order.
type FreezeOrder struct {
	OrderNumber string        // 订单编号
	RequestNum  string        // 外部请求号
	ID          uint64        // 自增ID
	Source      uint8         // 1~餐饮pos，2~商城履约订单，3~星团履约订单，4~星团活动库存
	SgID        uint32        // 商户ID
	DetailCount uint32        // 明细项数
	Status      uint8         // 0~已取消，1~已冻结待消费，2~已消费待扣库（活动单由外部控制，不进入此状态），3~已完成
	Remark      orm.JSON      // 透传大字段
	CreateTime  time.Time     // 冻结时间
	UpdateTime  time.Time     // 更新时间(最近一次解冻时间)
	ExpireTime  util.NullTime // 过期时间
}

// InventoryDetail represents inventory order detail.
type InventoryDetail struct {
	StorageKey      string    // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id
	StorageType     uint8     // 仓储类型：1~物料，2~商品（冗余存储，用于外部加载快速判定）
	ID              uint64    // 自增ID
	OrderID         uint64    // 订单ID
	WarehouseID     uint32    // 仓库ID
	Status          uint8     // 0~已取消，1~进行中，2~已生效
	Price           uint64    // 加权平均上月单价(精确到分)
	StorageQuantity float64   // 库存数量（基于零售单位）
	InputQuantity   float64   // 盘点数量（基于零售单位）
	DiffQuantity    float64   // 盘点差额数量（基于零售单位）
	Remark          orm.JSON  // 包含商品名称、编码、备注、换算数量、换算单位等不会改变的内容
	UpdateTime      time.Time // 更新时间
}

// InventoryOrder represents inventory order.
type InventoryOrder struct {
	OrderNumber string     // 盘点流水号
	Memo        string     // 订单备注
	ID          uint64     // 自增ID
	WarehouseID uint32     // 仓库ID
	SgID        uint32     // 商户ID
	Status      uint8      // 0~已取消，1~进行中，2~已生效
	DetailCount int        // 商品/物料项数（非明细数量之和）
	DiffTotal   int64      // 加权平均盘盈盘亏差额
	Submitter   uint32     // 提交员工ID(允许草稿被不同员工打开修改)
	CreateTime  time.Time  // 创建时间
	SubmitTime  *time.Time // 提交时间
	UpdateTime  time.Time  // 更新时间
}

// Submit 提交盘点单
func (i *InventoryOrder) Submit(submitter uint32, submitTime time.Time) {
	i.Submitter = submitter
	i.Status = constant.InventoryOrderDone
	i.SubmitTime = &submitTime
	i.UpdateTime = submitTime
}

// LossDetail represents loss order detail.
type LossDetail struct {
	IsAccounting bool      //如果存在父明细时，父明细为false，否则为true，只有子明细落入实际统计，以防止重复计算。
	StorageKey   string    // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id
	StorageType  uint8     // 仓储类型：1~物料，2~商品，3~加料（冗余存储，用于外部加载快速判定）
	ID           uint64    // 自增ID
	OrderID      uint64    // 订单ID
	WarehouseID  uint32    // 仓库ID
	ParentID     uint64    //父明细ID(无父明细时为0)
	Price        uint64    // 加权平均上月单价(精确到分)
	Quantity     float64   // 报损数量（基于零售单位）
	Remark       orm.JSON  // 包含商品名称、编码、备注、换算数量、换算单位、采购时库存数量等不会改变的内容
	CreateTime   time.Time // 创建时间
}

// LossOrder represents loss order.
type LossOrder struct {
	OrderNumber string    // 订单流水号
	ID          uint64    // 自增ID
	WarehouseID uint32    // 仓库ID
	SgID        uint32    // 商户ID
	Status      uint8     // 1~订单生效（暂时预留，目前下单即生效）
	DetailCount uint32    // 商品/物料项数（非明细数量之和）
	Total       uint64    // 订单总额（精确到分，取加权平均上月金额）
	Creator     uint32    // 创建员工ID
	CreateTime  time.Time // 创建时间
}

// Material represents material.
type Material struct {
	Code          string  // 编号
	Name          string  // 物料名称
	ID            uint64  // 自增ID
	SgID          uint32  // 商户ID
	PStoreID      uint32  // 总部/门店ID
	MtID          uint32  // 物料类别ID
	Status        uint8   // 物料状态1-有效, NULL-逻辑删除
	Unit          uint32  // 零售单位ID
	PurchaseUnit  uint32  // 采购单位
	StorageUnit   uint32  // 库存单位
	Operator      uint32  // 操作员工ID
	PurchaseRatio float64 // 采购单位换算比例
	StorageRatio  float64 // 库存单位换算比例

	CreateTime time.Time // 创建时间
	UpdateTime time.Time // 更新时间
}

// MaterialType represents material type.
type MaterialType struct {
	Name       string    // 类别名称
	Code       string    // 类别编号
	ID         uint32    // 自增ID
	SgID       uint32    // 商户ID
	PStoreID   uint32    // 总部/门店ID
	ParentID   uint32    // 父类别ID
	Status     uint8     // 状态：1~有效，null~逻辑删除
	Level      uint8     // 层级：1~一层，2~二层级
	Operator   uint32    // 操作员工ID
	CreateTime time.Time // 创建时间
	UpdateTime time.Time // 更新时间
}

// ProcessDetail represents process order detail.
type ProcessDetail struct {
	NotifyFlag   bool      // 缺货通知标记
	IsAccounting bool      // 如果存在父明细时，父明细为false，否则为true，只有子明细落入实际统计，以防止重复计算
	StorageKey   string    // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id；
	StorageType  uint8     // 仓储类型：1~物料，2~商品（冗余存储，用于外部加载快速判定）
	ID           uint64    // 明细ID
	OrderID      uint64    // 订单ID
	ParentID     uint64    // 父明细ID(无父明细时为0)
	WarehouseID  uint32    // 仓库ID
	Price        uint64    // 商品单价(物料这里可空)
	Status       uint8     // 0~待做库存变更，1~已完成库存变更，2~已取消库存变更
	Origin       int64     // 原始总额
	Discount     int64     // 营销优惠
	Trans        int64     // 分摊金额
	Quantity     float64   // 明细数量
	Remark       orm.JSON  // 备注信息（商品名称，商品编码，明细备注）
	CreateTime   time.Time // 创建时间
	UpdateTime   time.Time // 更新时间
}

// ProcessRequest represents process request
type ProcessRequest struct {
	RequestID     string        // 外部请求号
	ID            uint64        // 自增ID
	Source        uint8         // 2~商城履约订单，3~星团履约订单
	Status        uint8         // 验算状态0~已验算未冻结，1~已冻结未创建履约；2~已创建履约
	FreezeOrderID sql.NullInt64 // 冻结订单ID
	Body          orm.JSON      // 履约包裹验算内容
	CreateTime    time.Time     // 创建时间
	UpdateTime    time.Time     // 更新时间
}

// ProcessOrder represents process order.
type ProcessOrder struct {
	OrderNumber       string         // 订单流水号
	ExtOrderNumber    string         // 外部订单号
	MemberID          string         // 会员ID(下单人信息)
	NotifyFlag        bool           // 通知标记
	ExtractKey        sql.NullString // 取件码（取件后清空并转移到备注字段）
	ID                uint64         // 自增ID
	FreezeOrderID     sql.NullInt64  // 冻结订单ID
	Direction         uint8          // 1~消费,2~退货(不退货不存在库存process单)
	Source            uint8          // 1~商城订单，2~星团活动
	WarehouseID       uint32         // 仓库ID
	ProdTrans         int64          // 商品应付/应退(分摊)金额，不含配送费
	ExpectDeliverFee  int64          // 预收配送费
	ActualDeliverFee  int64          // 实际配送费总额
	DeliverType       uint8          // 配送模式0~自提，1~同城，2~普快
	Status            uint8          //  10~待备货(已付款)，11~待自提，20~待发货，21~已发货待签收， 30~待退货，31~已发货待接收，32~已拒绝接收，33~退货完成，98~正向已完成（自提完成/收货完成），99~已取消
	RefundFlag        uint8          // 退款标签，0~无进行中的取消标志，1~有进行中的取消标志
	ProdCount         uint32         // 商品数量(非明细数量)
	Operator          uint32         // 操作员ID
	ExpressOrderID    sql.NullInt64  // 配送订单ID
	ExpressPlatformID sql.NullInt64  // 配送平台ID
	AddressInfo       orm.JSON       // 地址信息
	Remark            orm.JSON       // 备注信息（含上游订单备注，以及其他备用字段）
	SubmitTime        time.Time      // 下单时间
	UpdateTime        time.Time      // 更新时间
	PrepareTime       util.NullTime  // 备货完成时间
	DeliverTime       util.NullTime  // 发货时间
	CompleteTime      util.NullTime  // 完成时间
	LastNotifyTime    util.NullTime  // 最近一次通知时间
	ExpectDeliverDate util.NullTime  // 预约发货/自提日期
	PromotionStatus   bool           // 分摊状态
}

// PurchaseDetail represents purchase order detail.
type PurchaseDetail struct {
	StorageKey       string    // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id
	StorageType      uint8     // 仓储类型：1~物料，2~商品3~加料（冗余存储，用于外部加载快速判定）
	ID               uint64    // 明细ID
	OrderID          uint64    // 订单ID
	WarehouseID      uint32    // 仓库ID
	Direction        uint8     // 1~采购入库，2~采购退货
	Price            uint64    // 采购单价(精确到分)
	LastPrice        uint64    // 上月加权平均价格(精确到分)
	Quantity         float64   // 采购数量（基于零售单位）
	RefundedQuantity float64   // 累计已退数量，仅采购单存在，用于防止超额退货
	Remark           orm.JSON  // 包含商品名称、编码、备注、换算数量、换算单位、采购时库存数量等不会改变的内容
	CreateTime       time.Time // 创建时间
}

// PurchaseOrder represents purchase order.
type PurchaseOrder struct {
	OrderNumber    string    // 订单流水号
	RefOrderNumber string    // 仅退货单存在，为原关联采购单号
	Memo           string    // 订单备注
	ID             uint64    // 自增ID
	WarehouseID    uint32    // 仓库ID
	SgID           uint32    // 商户ID
	Status         uint8     // 1~订单生效（暂时预留，目前下单即生效）
	Direction      uint8     // 1~采购入库，2~采购退货
	DetailCount    uint32    // 商品/物料项数（非明细采购数量之和）
	Total          int64     // 订单总额（精确到分）
	Creator        uint32    // 创建员工ID
	CreateTime     time.Time // 创建时间
}

// ScheduleDetail represents schedule order detail.
type ScheduleDetail struct {
	StorageKey      string    // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id
	StorageType     uint8     // 仓储类型：1~物料，2~商品，3~加料（冗余存储，用于外部加载快速判定）
	ID              uint64    // 明细ID
	OrderID         uint64    // 订单ID
	Price           uint64    // 调拨单价(精确到分)
	ApplyQuantity   float64   // 采购数量（基于零售单位）
	SendQuantity    float64   // 发送数量（基于零售单位）
	ReceiveQuantity float64   // 接收数量（基于零售单位）
	Remark          orm.JSON  // 包含商品名称、编码、备注、换算数量、换算单位等不会改变的内容
	CreateTime      time.Time // 创建时间
	UpdateTime      time.Time // 更新时间
}

// ScheduleOrder represents schedule order.
type ScheduleOrder struct {
	OrderNumber    string     // 订单号
	Reason         string     // 拒绝原因
	ID             uint64     // 自增ID
	InWarehouseID  uint32     // 调入仓库ID
	OutWarehouseID uint32     // 自增ID
	SgID           uint32     // 调出仓库ID
	Status         uint8      // 1~订单创建，2~订单已审核，3~订单已入库，4~订单已拒绝
	DetailCount    uint32     // 商品/物料项数（非明细采购数量之和）
	Total          uint64     // 订单总额（精确到分）
	Applier        uint32     // 申请/创建员工ID
	Reviewer       uint32     // 调出/审核员工ID
	Receiver       uint32     // 接受/入库员工ID
	ApplierName    string     // 申请员工名称
	ReviewerName   string     // 审核员工名称
	ReceiverName   string     // 入库员工名称
	ApplyTime      time.Time  // 申请时间
	SendTime       *time.Time // 审核/调出时间
	ReceiveTime    *time.Time // 接受/入库时间
}

// StatsDaily represents daily stats.
type StatsDaily struct {
	StorageName   string    // 商品名称(覆盖更新快照)
	StorageKey    string    // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id；加料模式：f-feed_id
	StorageType   uint8     // 仓储类型：1~物料，2~商品，3~加料（冗余存储，用于外部加载快速判定），3~加料(预留类型，仅pos单存在)
	ID            uint64    // 自增ID
	ActionType    uint8     // 操作类型：1~采购入库，2~采购退货，3~调拨出库，4~调拨入库
	WarehouseID   uint32    // 仓库类型
	Price         int64     // 操作对应加权库存单价(分)，仅用于展示，不用于换算
	Amount        int64     // 总额(分)
	Quantity      float64   // 基于零售单位份数变更量
	RecordDate    time.Time // 记录日期（履约&pos单&历史记录按日期自动合并，后面改为每日结算；内部库存单按流水记录）
	OperationUnit string    // 操作单价对应单位，仅用于展示，不用于换算
	SkuName       string    // 规格名称
}

// StatsMonthly represents monthly stats.
type StatsMonthly struct {
	Month            string   `gorm:"primary_key"` // 月份
	StorageKey       string   `gorm:"primary_key"` // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id，加料模式f-feed_id
	StorageType      uint8    // 仓储类型：1~物料，2~商品（冗余存储，用于外部加载快速判定）3~加料
	WarehouseID      uint32   `gorm:"primary_key"` // 仓库ID
	StartAmount      int64    // 期初金额
	PurchaseAmount   int64    // 采购金额
	ScheduleAmount   int64    // 调拨金额
	CostAmount       int64    // 成本金额(期初+采购+调拨-期末)
	EndAmount        int64    // 期末金额
	Price            int64    // 月加权期末库存单价，需要结合快照单位换算使用
	StartQuantity    float64  // 期初仓储数量
	PurchaseQuantity float64  // 采购数量
	ScheduleQuantity float64  // 调拨数量
	CostQuantity     float64  // 使用成本数量(期初+采购+调拨-期末)
	EndQuantity      float64  // 期末仓储数量
	Remark           orm.JSON // 备用搜索信息（包含类别ID, 名称，编码，月结时刻库存单位，月结时刻库存换算比）
}

// Storage represents storage.
type Storage struct {
	StorageKey     string    `gorm:"primary_key"` // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id，加料模式f-feed_id
	StorageType    uint8     // 仓储类型：1~物料，2~商品（冗余存储，用于外部加载快速判定）3~加料
	WarehouseID    uint32    `gorm:"primary_key"` // 仓库ID
	StorageMode    uint8     // 配置模式：0~弱管控，允许扣负，1~强管控(无库存不能下单)，2~无限量模式
	ProdID         *uint64   // 商品ID（用于外部快速查看）
	MaterialID     *uint64   // 物料ID（用于外部快速查看）
	Quantity       float64   // 储量（基于零售单位）
	FreezeQuantity float64   // 已冻结数量
	Remark         orm.JSON  // 备用搜索信息（包含类别ID, 名称，编码）
	UpdateTime     time.Time // 更新时间
}

// Storage represents storage.
type StorageBak struct {
	StorageKey     string    `gorm:"primary_key"` // 仓储关键字：商品模式：prod_id-sku_id；物料模式：m-material_id，加料模式f-feed_id
	StorageType    uint8     // 仓储类型：1~物料，2~商品（冗余存储，用于外部加载快速判定）3~加料
	WarehouseID    uint32    `gorm:"primary_key"` // 仓库ID
	StorageMode    uint8     // 配置模式：0~弱管控，允许扣负，1~强管控(无库存不能下单)，2~无限量模式
	ProdID         *uint64   // 商品ID（用于外部快速查看）
	MaterialID     *uint64   // 物料ID（用于外部快速查看）
	Quantity       float64   // 储量（基于零售单位）
	FreezeQuantity float64   // 已冻结数量
	Remark         orm.JSON  // 备用搜索信息（包含类别ID, 名称，编码）
	UpdateTime     time.Time // 更新时间
}

// Unit represents unit.
type Unit struct {
	Name       string    // 单位名称
	ID         uint32    // 单位ID
	Status     uint8     // 单位状态1-有效, NULL-逻辑删除
	SgID       uint32    // 品牌ID（0时为全局）
	PStoreID   uint32    // 总部/门店ID（与sg_id同时为0时为全局）
	Operator   uint32    // 员工ID
	CreateTime time.Time // 创建时间
	UpdateTime time.Time // 更新时间
}

// Warehouse represents warehouse.
type Warehouse struct {
	Name            string        // 仓库名称（同步门店名称）
	Address         string        // 地址（同步门店地址）
	CityCode        uint32        // 城市编码（同城匹配使用）
	RegionCode      string        // 城市区号（达达使用）
	Contact         string        // 联系人
	Mobile          string        // 联系电话（允许座机）
	PickUp          bool          // 是否支持自提
	CityExpress     bool          // 是否支持同城
	OrdinaryExpress bool          // 是否支持普快
	ID              uint32        // 仓库ID
	SgID            uint32        // 品牌ID
	StoreID         uint32        // 门店衍生仓库时，为门店ID，否则为NULL
	Status          uint8         // 仓库状态，1~启用，2~停用，3~异常（历史迁移，必要信息不全），0~删除
	StorageMode     uint8         // 配置模式：0~弱管控，允许扣负，1~强管控(无库存不能下单)
	Operator        uint32        // 更新员工
	Lat             float64       // 纬度
	Lng             float64       // 经度
	Deadline        util.Duration // 每日截止接单时间
	SyncTime        *time.Time    // 同步时间
	StatsTime       *time.Time    // 上次月结时间
	CreateTime      time.Time     // 创建时间
	UpdateTime      time.Time     // 更新时间
}

// 事务性消息
type NsqMessage struct {
	ID          uint64     // 自增主键
	Topic       string     // 消息topic
	MsgKey      string     // 消息唯一标识
	Payload     orm.JSON   // 消息内容
	Status      uint8      // 消息状态， 0~初始，1~成功，2~标记成功
	ExecuteTime *time.Time // 下一次执行时间
	Retry       uint32     // 重试次数
	CreateTime  time.Time  // 创建时间
	UpdateTime  time.Time  // 更新时间
}
